package lanqiao.真题.第12届Java大学B组;

import java.util.HashSet;
import java.util.Set;

/**
 * @author 挚爱之夕
 * @version 1.0
 * @implSpec
 * 在平面直角坐标系中，两点可以确定一条直线。如果有多点在一条直线上，那么这些点中任意两点确定的直线是同一条。
 * 给定平面上2×3个整点{(x,y)| 0≤x<2,0≤y<3,x∈Z,y∈Z},即横坐标是0到1（包含0和1）之间的整数、
 * 纵坐标是0到2（包含0和2）之间的整数的点。
 * 这些点一共确定了11条不同的直线。
 * 给定平面上20×21个整点{(x,y)0≤x<20,0≤y<21,x∈Z,y∈Z,即横坐标是0到19（包含0和19）之间的整数、
 * 纵坐标是0到20（包含0和20）之间的整数的点。请问这些点一共确定了多少条不同的直线。
 * @since 2023 - 04 - 07 - 23:44
 */
public class C_直线 {
}
class MainC{
    //	static int x = 2, y = 3;
    static int x = 20, y = 21;
    static int[][] points;
    public static void main(String[] args) {
        int n = x * y;
        points = new int[n][2];
        Set<String> set = new HashSet<String>();
        int cur = 0;
        for(int i = 0; i < x; i++) {
            for(int j = 0; j < y; j++) {
                points[cur][0] = i;
                points[cur][1] = j;
                cur++;
            }
        }
        int x1, y1, x2, y2;
        for(int i = 0; i < n; i++) {
            for(int j = i + 1; j < n; j++) {
                x1 = points[i][0];
                y1 = points[i][1];
                x2 = points[j][0];
                y2 = points[j][1];
                if(x1 == x2) {
                    set.add("max," + x1);
                }else if(y1 == y2) {
                    set.add("0," + y1);
                }else {
                    /*
y1=kx1+b
y2=kx2+b

x2*y1=k*x1*x2+x2*b
x1*y2=k*x1*x2+x1*b
b=(x2*y1-x1*y2) / (x2-x1) = (y1 * (x2 - x1) - x1 * (y2 - y1) ) / (x2 - x1)
Java中是不能够通过==直接判断两个浮点数是否相等的，为此我们用
k:(y2 - y1) / (x2 - x1)
b: y1 * (x2 - x1) - x1 * (y2 - y1) / (x2 - x1)
字符串的形式表示一根直线。
                     */
                    StringBuilder sb = new StringBuilder();
                    int y0 = y2 - y1;
                    int x0 = x2 - x1;
                    int r = gcd(y0, x0);
                    sb.append(y0 / r + " ");
                    sb.append(x0 / r + " ");

                    y0 = y1 * x0 - x1 * y0;
                    r = gcd(y0, x0);
                    sb.append(y0 / r + " ");
                    sb.append(x0 / r);
                    set.add(sb.toString());
                }
            }
        }
        System.out.println(set.size());
    }
    static int gcd(int a, int b) {
        if(b == 0) {
            return a;
        }
        return gcd(b, a % b);
    }
}